#include "drv_usart.h"

/***************************
函数名：drv_usart_init

函数功能：串口复用初始化

输入参数：无

输出参数：无

其它说明：

****************************/
void drv_usart_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct ;   //定义结构体
	USART_InitTypeDef USART_InitStruct ;
	NVIC_InitTypeDef NVIC_InitStruct ;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//开启接口和串口的时钟
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ; //设置功能为复用
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ;  //类型设置为推挽
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 ; //设置引脚号
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; //上拉下拉设置为 上拉 高电平
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; //速度为50
	GPIO_Init( GPIOA, & GPIO_InitStruct); //初始化串口

	GPIO_PinAFConfig( GPIOA, GPIO_PinSource9, GPIO_AF_USART1) ;  //复用功能配置
	GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_USART1) ;
	
	USART_InitStruct.USART_BaudRate = 115200 ;  //波特率设置
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ; //串口模式 接收|发送
	USART_InitStruct.USART_Parity = USART_Parity_No ; // 校验位无
	USART_InitStruct.USART_StopBits = USART_StopBits_1 ; // 停止位为 1
	USART_InitStruct.USART_WordLength = USART_WordLength_8b ; //数据位8 bits位

	USART_Init( USART1, &USART_InitStruct);  //设置初始化
	USART_ClearFlag( USART1, USART_FLAG_TC);  //清空发送的标志位

	//中断设置	
	USART_ITConfig( USART1, USART_IT_RXNE, ENABLE); //指定的中断源，参数1：串口号 参数2：中断源 参数3：使能
	USART_ITConfig( USART1, USART_IT_IDLE, ENABLE);//设置空闲中断源

	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn ; //通道号，查询启动文件
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ; //抢占优先级 
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0 ; //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ; //使能
	NVIC_Init(&NVIC_InitStruct);
	
	USART_Cmd( USART1, ENABLE);//串口使能

}

//wifi模块串口初始化
void drv_usart2_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct ;	 //定义结构体
	USART_InitTypeDef USART_InitStruct ;
	NVIC_InitTypeDef NVIC_InitStruct ;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//开启接口和串口的时钟
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ; //设置功能为复用
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ;  //类型设置为推挽
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 ; //设置引脚号
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; //上拉下拉设置为 上拉 高电平
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; //速度为50
	GPIO_Init( GPIOD, & GPIO_InitStruct); //初始化串口

	GPIO_PinAFConfig( GPIOD, GPIO_PinSource5, GPIO_AF_USART2) ;  //复用功能配置
	GPIO_PinAFConfig( GPIOD, GPIO_PinSource6, GPIO_AF_USART2) ;
	
	USART_InitStruct.USART_BaudRate = 115200 ;	//波特率设置
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ; //串口模式 接收|发送
	USART_InitStruct.USART_Parity = USART_Parity_No ; // 校验位无
	USART_InitStruct.USART_StopBits = USART_StopBits_1 ; // 停止位为 1
	USART_InitStruct.USART_WordLength = USART_WordLength_8b ; //数据位8 bits位

	USART_Init( USART2, &USART_InitStruct);  //设置初始化
	USART_ClearFlag( USART2, USART_FLAG_TC);  //清空发送的标志位

	//中断设置	
	USART_ITConfig( USART2, USART_IT_RXNE, ENABLE); //指定的中断源，参数1：串口号 参数2：中断源 参数3：使能
	//USART_ITConfig( USART2, USART_IT_IDLE, ENABLE);//设置空闲中断源

	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn ; //通道号，查询启动文件
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ; //抢占优先级 
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0 ; //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ; //使能
	NVIC_Init(&NVIC_InitStruct);
	
	USART_Cmd( USART2, ENABLE);//串口使能

}

void usart_sendstr(USART_TypeDef* USARTx,char *str,int size)
{
	uint8_t i = 0;
	USART_ClearFlag(USARTx,USART_FLAG_TC);
	for (i = 0; i < size; ++i)
	{         
		USART_SendData( USARTx, *str);
		while(RESET == USART_GetFlagStatus(USARTx,USART_FLAG_TC));
		USART_ClearFlag(USARTx,USART_FLAG_TC);
		str++;
	}
}

/***************************
函数名：fputc

函数功能：重载fputc函数

输入参数：无

输出参数：无

其它说明：

****************************/

int fputc(int ch, FILE *F)
{
	USART_SendData( USART1,ch );
	while(USART_GetFlagStatus( USART1, USART_FLAG_TC) == RESET);
	USART_ClearFlag( USART1, USART_FLAG_TC);
	return ch ;
}

